/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 处理流.转换流;

import org.junit.Test;

import java.io.*;

/**
 * @Description 转换流 处理流之一（也属于字符流，名称看后缀）
 * 转换流提供了在字节流和字符流之间的转换
 * Java API 提供了两个转换流：
 * InputStreamReader ：将 InputStream 转换为 Reader
 * OutputStreamWriter ：将 Writer 转换为 OutputStream
 * 字节流中的数据都是字符时，转成字符流操作更 高效 。
 * 很多时候我们使用转换流来处理文件乱码问题。实现编码和
 * 解码的功能。
 * <p>
 * InputStreamReader
 * 实现 将字节的输入流按指定字符集转换为字符的输入流。
 * 需要 和 InputStream “套接”。
 * 常用构造器
 * public InputStreamReader (InputStream in)
 * public InputStreamReader (InputStream in,String charsetName)
 * 如：Reader isr = new InputStreamReader(System.in,"GBK）;
 * <p>
 * OutputStreamWriter
 * 实现将字符的输出流按 指定 字符集转换为字节的输出流。
 * 需要 和 OutputStream “套接”。
 * 常用构造器
 * public OutputStreamWriter (OutputStream out)
 * public OutputStreamWriter (OutputStream out,String charsetName)第二个参数同样是字符集
 * @Author 俊昭
 * @Date 2022/4/25
 */
public class InputStreamReaderAndOutStreamWriter {
    /**
     * 结合使用InputStreamReader & OutStreamWriter
     * 实现将文本文件由字节形式读入 转为字符输出到控制台 再转换为字节写出
     */
    @Test
    public void test001() {
        InputStreamReader isr = null;
        OutputStreamWriter osw = null;
        try {
            FileInputStream fis = new FileInputStream("C:\\Users\\Junzhao\\IOStream\\转换流\\前出师表.txt");
            FileOutputStream fos = new FileOutputStream("C:\\Users\\Junzhao\\IOStream\\转换流\\前出师表复制.txt");

            isr = new InputStreamReader(fis, "UTF-8");
            osw = new OutputStreamWriter(fos,"gbk");
            // 编码字符集参数取决于原文件“前出师表.txt”是用什么编码保存

            // 将读出数据输出到控制台
            char[] c = new char[1024];
            int len;
            String s;
            while ((len = isr.read(c)) != - 1) {
                s=new String(c,0,len);
                osw.write(s,0,len);
                System.out.println(s);

//    或者        for (int i = 0; i <len;i++) {
//                    System.out.print(c[i]);
//                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                if (osw != null) {
                    osw.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                if (isr != null) {
                    try {
                        isr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }


        }
    }
}
